#include <iostream>
using namespace std;

/*
    环状继承：A派生出B和C ，B和C派生出D
        直接父类和间接父类：
            直接父类：离子类最近的父类
            间接父类：间隔至少一层关系的父类
        构建顺序：
            1.先构造Catamount类 --> 发现有Animal父类，先构造Animal类,再构建Catamount类
            2.构造Mammal类 --> 发现有Animal父类，先构造Animal类，再构建Mammal类
            3.构造Leopard类 
        出现的问题1：D调用A的方法，出现二义性错误
        问题出现的原因：
            Leopard类调用Animal的eat()方法，但是Leopard类中有两个Animal类副本，编译器分不清
        解决办法：
            使用::运算符，指定调用的父类方法   lp.Catamount::eat();
        出现的问题2：在创建Leopard对象的时候，Animal被构建了两次，C++认为浪费了存储空间，C++希望Animal只被创建一次
        解决办法：
            使用虚继承解决问题1和问题2

*/
class Animal
{
public:
    Animal()
    {
        cout << "Animal()" << endl;
    }
    void eat()
    {
        cout << "Animal吃" << endl;
    }
};
class Catamount : public Animal
{
public:
    Catamount()
    {
        cout << "Catamount()" << endl;
    }
    void catchMouse()
    {
        cout << "Catamount抓老鼠" << endl;
    }
};
class Mammal:public Animal
{
public:
    Mammal()
    {
        cout << "Mammal()" << endl;
    }
    void drinkMilk()
    {
        cout << "Mammal喝奶" << endl;
    }
};
class Leopard : public Catamount, public Mammal
{
public:
    Leopard()
    {
        cout << "Leopard()" << endl;
    }
    void play()
    {
        cout << "Leopard玩" << endl;
    }
};

int main()
{
    cout << "构建顺序：" << endl;
    Leopard lp;
    cout << "指定Leopard父类调用Animal父类的eat()方法" << endl;
    lp.Catamount::eat();
    lp.Mammal::eat();




    return 0;
}